<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>28.4. Manipulating Measurements</title>
<link rel="stylesheet" href="dbstyle.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.72.0">
<link rel="start" href="index.html" title="Programmer's Reference Guide">
<link rel="up" href="zend.measure.html" title="Chapter 28. Zend_Measure">
<link rel="prev" href="zend.measure.output.html" title="28.3. Outputting measurements">
<link rel="next" href="zend.measure.types.html" title="28.5. Types of measurements">
<link rel="chapter" href="introduction.html" title="Chapter 1. Introduction to Zend Framework">
<link rel="chapter" href="zend.acl.html" title="Chapter 2. Zend_Acl">
<link rel="chapter" href="zend.auth.html" title="Chapter 3. Zend_Auth">
<link rel="chapter" href="zend.cache.html" title="Chapter 4. Zend_Cache">
<link rel="chapter" href="zend.config.html" title="Chapter 5. Zend_Config">
<link rel="chapter" href="zend.console.getopt.html" title="Chapter 6. Zend_Console_Getopt">
<link rel="chapter" href="zend.controller.html" title="Chapter 7. Zend_Controller">
<link rel="chapter" href="zend.currency.html" title="Chapter 8. Zend_Currency">
<link rel="chapter" href="zend.date.html" title="Chapter 9. Zend_Date">
<link rel="chapter" href="zend.db.html" title="Chapter 10. Zend_Db">
<link rel="chapter" href="zend.debug.html" title="Chapter 11. Zend_Debug">
<link rel="chapter" href="zend.dojo.html" title="Chapter 12. Zend_Dojo">
<link rel="chapter" href="zend.dom.html" title="Chapter 13. Zend_Dom">
<link rel="chapter" href="zend.exception.html" title="Chapter 14. Zend_Exception">
<link rel="chapter" href="zend.feed.html" title="Chapter 15. Zend_Feed">
<link rel="chapter" href="zend.filter.html" title="Chapter 16. Zend_Filter">
<link rel="chapter" href="zend.form.html" title="Chapter 17. Zend_Form">
<link rel="chapter" href="zend.gdata.html" title="Chapter 18. Zend_Gdata">
<link rel="chapter" href="zend.http.html" title="Chapter 19. Zend_Http">
<link rel="chapter" href="zend.infocard.html" title="Chapter 20. Zend_InfoCard">
<link rel="chapter" href="zend.json.html" title="Chapter 21. Zend_Json">
<link rel="chapter" href="zend.layout.html" title="Chapter 22. Zend_Layout">
<link rel="chapter" href="zend.ldap.html" title="Chapter 23. Zend_Ldap">
<link rel="chapter" href="zend.loader.html" title="Chapter 24. Zend_Loader">
<link rel="chapter" href="zend.locale.html" title="Chapter 25. Zend_Locale">
<link rel="chapter" href="zend.log.html" title="Chapter 26. Zend_Log">
<link rel="chapter" href="zend.mail.html" title="Chapter 27. Zend_Mail">
<link rel="chapter" href="zend.measure.html" title="Chapter 28. Zend_Measure">
<link rel="chapter" href="zend.memory.html" title="Chapter 29. Zend_Memory">
<link rel="chapter" href="zend.mime.html" title="Chapter 30. Zend_Mime">
<link rel="chapter" href="zend.openid.html" title="Chapter 31. Zend_OpenId">
<link rel="chapter" href="zend.paginator.html" title="Chapter 32. Zend_Paginator">
<link rel="chapter" href="zend.pdf.html" title="Chapter 33. Zend_Pdf">
<link rel="chapter" href="zend.registry.html" title="Chapter 34. Zend_Registry">
<link rel="chapter" href="zend.rest.html" title="Chapter 35. Zend_Rest">
<link rel="chapter" href="zend.search.lucene.html" title="Chapter 36. Zend_Search_Lucene">
<link rel="chapter" href="zend.server.html" title="Chapter 37. Zend_Server">
<link rel="chapter" href="zend.service.html" title="Chapter 38. Zend_Service">
<link rel="chapter" href="zend.session.html" title="Chapter 39. Zend_Session">
<link rel="chapter" href="zend.soap.html" title="Chapter 40. Zend_Soap">
<link rel="chapter" href="zend.test.html" title="Chapter 41. Zend_Test">
<link rel="chapter" href="zend.text.html" title="Chapter 42. Zend_Text">
<link rel="chapter" href="zend.timesync.html" title="Chapter 43. Zend_TimeSync">
<link rel="chapter" href="zend.translate.html" title="Chapter 44. Zend_Translate">
<link rel="chapter" href="zend.uri.html" title="Chapter 45. Zend_Uri">
<link rel="chapter" href="zend.validate.html" title="Chapter 46. Zend_Validate">
<link rel="chapter" href="zend.version.html" title="Chapter 47. Zend_Version">
<link rel="chapter" href="zend.view.html" title="Chapter 48. Zend_View">
<link rel="chapter" href="zend.xmlrpc.html" title="Chapter 49. Zend_XmlRpc">
<link rel="appendix" href="requirements.html" title="Appendix A. Zend Framework Requirements">
<link rel="appendix" href="coding-standard.html" title="Appendix B. Zend Framework Coding Standard for PHP">
<link rel="appendix" href="copyrights.html" title="Appendix C. Copyright Information">
<link rel="index" href="the.index.html" title="Index">
<link rel="subsection" href="zend.measure.edit.html#zend.measure.edit.convert" title="28.4.1. Convert">
<link rel="subsection" href="zend.measure.edit.html#zend.measure.edit.add" title="28.4.2. Add and subtract">
<link rel="subsection" href="zend.measure.edit.html#zend.measure.edit.equal" title="28.4.3. Compare">
<link rel="subsection" href="zend.measure.edit.html#zend.measure.edit.compare" title="28.4.4. Compare">
<link rel="subsection" href="zend.measure.edit.html#zend.measure.edit.changevalue" title="28.4.5. Manually change values">
<link rel="subsection" href="zend.measure.edit.html#zend.measure.edit.changetype" title="28.4.6. Manually change types">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader"><table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">28.4. Manipulating Measurements</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="zend.measure.output.html">Prev</a> </td>
<th width="60%" align="center">Chapter 28. Zend_Measure</th>
<td width="20%" align="right"> <a accesskey="n" href="zend.measure.types.html">Next</a>
</td>
</tr>
</table></div>
<div class="sect1" lang="en">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="zend.measure.edit"></a>28.4. Manipulating Measurements</h2></div></div></div>
<p>
        Parsing and normalization of input, combined with output to localized notations makes data accessible to users
        in different locales. Many additional methods exist in <code class="code">Zend_Measure_*</code> components to manipulate and
        work with this data, after it has been normalized.
    </p>
<div class="itemizedlist"><ul type="disc">
<li><p>
                <a href="zend.measure.edit.html#zend.measure.edit.convert" title="28.4.1. Convert"><code class="code">Convert</code>
                </a>
            </p></li>
<li><p>
                <a href="zend.measure.edit.html#zend.measure.edit.add" title="28.4.2. Add and subtract"><code class="code">Add and subtract</code>
                </a>
            </p></li>
<li><p>
                <a href="zend.measure.edit.html#zend.measure.edit.equal" title="28.4.3. Compare"><code class="code">Compare to boolean</code>
                </a>
            </p></li>
<li><p>
                <a href="zend.measure.edit.html#zend.measure.edit.compare" title="28.4.4. Compare"><code class="code">Compare to greater/smaller</code>
                </a>
            </p></li>
<li><p>
                <a href="zend.measure.edit.html#zend.measure.edit.changevalue" title="28.4.5. Manually change values"><code class="code">Manually change values</code>
                </a>
            </p></li>
<li><p>
                <a href="zend.measure.edit.html#zend.measure.edit.changetype" title="28.4.6. Manually change types"><code class="code">Manually change types</code>
                </a>
            </p></li>
</ul></div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.measure.edit.convert"></a>28.4.1. Convert</h3></div></div></div>
<p>
            Probably the most important feature is the conversion into different units of measurement. The conversion of
            a unit can be done any number of times using the method <code class="code">convertTo()</code>. Units of measurement can
            only be converted to other units of the same type (class). Therefore, it is not possible to convert (e.g.) a
            length into a weight, which would might encourage poor programming practices and allow errors to propagate
            without exceptions.
        </p>
<p>
            The <code class="code">convertTo</code> method accepts an optional parameter. With this parameter you can define
            an precision for the returned output. The standard precision is '<code class="code">2</code>'.
        </p>
<div class="example">
<a name="zend.measure.edit.convert.example-1"></a><p class="title"><b>Example 28.10. Convert</b></p>
<div class="example-contents"><pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Weight.php';

$locale = new Zend_Locale('de');
$mystring = "1.234.567,89";
$unit = new Zend_Measure_Weight($mystring,'POND', $locale);

print "Kilo:".$unit-&gt;convertTo('KILOGRAM');

// constants are considered "better practice" than strings
print "Ton:".$unit-&gt;convertTo(Zend_Measure_Weight::TON);

// define a precision for the output
print "Ton:".$unit-&gt;convertTo(Zend_Measure_Weight::TON, 3);
            </pre></div>
</div>
<br class="example-break">
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.measure.edit.add"></a>28.4.2. Add and subtract</h3></div></div></div>
<p>
            Measurements can be added together using <code class="code">add()</code> and subtracted using <code class="code">sub()</code>. Each
            addition will create a new object for the result. The actual object will never be changed by the class. The
            new object will be of the same type as the originating object. Dynamic objects support a fluid style of
            programming, where complex sequences of operations can be nested without risk of side-effects altering the
            input objects.
        </p>
<p>
            </p>
<div class="example">
<a name="zend.measure.edit.add.example-1"></a><p class="title"><b>Example 28.11. Adding units</b></p>
<div class="example-contents"><pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Length.php';

// Define objects
$unit = new Zend_Measure_Length(200, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

// Add $unit2 to $unit
$sum = $unit-&gt;add($unit2);

echo $sum; // outputs "300 cm"
                </pre></div>
</div>
<p><br class="example-break">
        </p>
<div class="note"><table border="0" summary="Note: Automatic conversion">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td>
<th align="left">Automatic conversion</th>
</tr>
<tr><td align="left" valign="top"><p>
                Adding one object to another will automatically convert it to the correct unit. It is not neccessary to
                call
                <a href="zend.measure.edit.html#zend.measure.edit.convert" title="28.4.1. Convert"><code class="code">convertTo()</code>
                </a>
                before adding different units.
            </p></td></tr>
</table></div>
<p>
            </p>
<div class="example">
<a name="zend.measure.edit.add.example-2"></a><p class="title"><b>Example 28.12. Subtract</b></p>
<div class="example-contents">
<p>
                    Subtraction of measurements works just like addition.
                </p>
<pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Length.php';

// Define objects
$unit = new Zend_Measure_Length(200, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

// Subtract $unit2 from $unit
$sum = $unit-&gt;sub($unit2);

echo $sum;
                </pre>
</div>
</div>
<p><br class="example-break">
        </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.measure.edit.equal"></a>28.4.3. Compare</h3></div></div></div>
<p>
            Measurements can also be compared, but without automatic unit conversion. Thus, <code class="code">equals()</code>
            returns <code class="code">TRUE</code>, only if both the value and the unit of measure are identical.
        </p>
<p>
            </p>
<div class="example">
<a name="zend.measure.edit.equal.example-1"></a><p class="title"><b>Example 28.13. Different measurements</b></p>
<div class="example-contents"><pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Length.php';

// Define measurements
$unit = new Zend_Measure_Length(100, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

if ($unit-&gt;equals($unit2)) {
    print "Both measurements are identical";
} else {
    print "These are different measurements";
}
                </pre></div>
</div>
<p><br class="example-break">
            </p>
<div class="example">
<a name="zend.measure.edit.equal.example-2"></a><p class="title"><b>Example 28.14. Identical measurements</b></p>
<div class="example-contents"><pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Length.php';

// Define measurements
$unit = new Zend_Measure_Length(100, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

$unit2-&gt;setType(Zend_Measure_Length::CENTIMETER);

if ($unit-&gt;equals($unit2)) {
    print "Both measurements are identical";
} else {
    print "These are different measurements";
}
                </pre></div>
</div>
<p><br class="example-break">
        </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.measure.edit.compare"></a>28.4.4. Compare</h3></div></div></div>
<p>
            To determine if a measurement is less than or greater than another, use <code class="code">compare()</code>, which
            returns 0, -1 or 1 depending on the difference between the two objects. Identical measurements will return
            0. Lesser ones will return a negative, greater ones a positive value.
        </p>
<p>
            </p>
<div class="example">
<a name="zend.measure.edit.compare.example-1"></a><p class="title"><b>Example 28.15. Difference</b></p>
<div class="example-contents"><pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Length.php';

$unit = new Zend_Measure_Length(100, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);
$unit3 = new Zend_Measure_Length(1.2, Zend_Measure_Length::METER);

print "Equal:".$unit2-&gt;compare($unit);
print "Lesser:".$unit2-&gt;compare($unit3);
print "Greater:".$unit3-&gt;compare($unit2);
                </pre></div>
</div>
<p><br class="example-break">
        </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.measure.edit.changevalue"></a>28.4.5. Manually change values</h3></div></div></div>
<p>
            To change the value of a measurement explicitly, use <code class="code">setValue()</code>. to overwrite the current
            value. The parameters are the same as the constructor.
        </p>
<p>
            </p>
<div class="example">
<a name="zend.measure.edit.changevalue.example-1"></a><p class="title"><b>Example 28.16. Changing a value</b></p>
<div class="example-contents"><pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Length.php';

$locale = new Zend_Locale('de_AT');
$unit = new Zend_Measure_Length(1,Zend_Measure_Length::METER);

$unit-&gt;setValue(1.2);
echo $unit;

$unit-&gt;setValue(1.2, Zend_Measure_Length::KILOMETER);
echo $unit;

$unit-&gt;setValue("1.234,56", Zend_Measure_Length::MILLIMETER,$locale);
echo $unit;
                </pre></div>
</div>
<p><br class="example-break">
        </p>
</div>
<div class="sect2" lang="en">
<div class="titlepage"><div><div><h3 class="title">
<a name="zend.measure.edit.changetype"></a>28.4.6. Manually change types</h3></div></div></div>
<p>
            To change the type of a measurement without altering its value use <code class="code">setType()</code>.
        </p>
<div class="example">
<a name="zend.measure.edit.changetype.example-1"></a><p class="title"><b>Example 28.17. Changing the type</b></p>
<div class="example-contents"><pre class="programlisting">&lt;?php
require_once 'Zend/Measure/Length.php';

$unit = new Zend_Measure_Length(1,Zend_Measure_Length::METER);
echo $unit; // outputs "1 m"

$unit-&gt;setType(Zend_Measure_Length::KILOMETER);
echo $unit; // outputs "1000 km"
            </pre></div>
</div>
<br class="example-break">
</div>
</div>
<div class="navfooter"><table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="zend.measure.output.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="zend.measure.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="zend.measure.types.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">28.3. Outputting measurements </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> 28.5. Types of measurements</td>
</tr>
</table></div>
<div class="revinfo"></div>
</body>
</html>
